package com.operator.Activitys.utils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.telephony.TelephonyManager;

import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

/**
 * 项目名称：
 * 类描述：网络相关辅助类
 * 创建人：张飞祥
 * 创建时间：2018/04/18 下午2:17
 * 修改人：张飞祥
 * 修改时间：2018/04/18 下午2:17
 * 修改备注：
 */
public class NetUtils {
    private NetUtils() {
        /* cannot be instantiated */
        throw new UnsupportedOperationException("cannot be instantiated");
    }

    /**
     * 判断网络是否连接
     *
     * @param context
     * @return
     */
    public static boolean isConnected(Context context) {

        ConnectivityManager connectivity = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (null != connectivity) {

            NetworkInfo info = connectivity.getActiveNetworkInfo();
            if (null != info && info.isConnected()) {
                if (info.getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判断是否是wifi连接
     */
    public static boolean isWifi(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (cm == null)
            return false;
        return cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;

    }

    /**
     * 打开网络设置界面
     */
    public static void openSetting(Activity activity) {
        Intent intent = null;
        String sdkVersion = Build.VERSION.SDK;
        if (Integer.valueOf(sdkVersion) > 10) {
            intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS);
        } else {
            intent = intent = new Intent();
            ComponentName cm = new ComponentName("com.android.settings",
                    "com.android.settings.WirelessSettings");
            intent.setComponent(cm);
            intent.setAction("android.intent.action.VIEW");
        }
        activity.startActivity(intent);
    }

    public static String getYYS(Context context){
        String sendNum = "";
        TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        /** 获取SIM卡的IMSI码
         * SIM卡唯一标识：IMSI 国际移动用户识别码（IMSI：International Mobile Subscriber Identification Number）是区别移动用户的标志，
         * 储存在SIM卡中，可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成，其中MCC为移动国家号码，由3位数字组成，
         * 唯一地识别移动客户所属的国家，我国为460；MNC为网络id，由2位数字组成，
         * 用于识别移动客户所归属的移动网络，中国移动为00，中国联通为01,中国电信为03；MSIN为移动客户识别码，采用等长11位数字构成。
         * 唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通，只需取得SIM卡中的MNC字段即可
         */
        String imsi = telManager.getSubscriberId();
        if(imsi!=null){
            if(imsi.startsWith("46000") || imsi.startsWith("46002")|| imsi.startsWith("46007")|| imsi.startsWith("46020")){
                //中国移动
                sendNum = "中国移动";
            }else if(imsi.startsWith("46001")|| imsi.startsWith("46006")|| imsi.startsWith("46009")){
                //中国联通
                sendNum = "中国联通";
            }else if(imsi.startsWith("46003")|| imsi.startsWith("46005")|| imsi.startsWith("46011")){
                //中国电信
                sendNum = "中国电信";
            }
        }
        return sendNum;
    }




    /**
     * 获取 当前设备 真实 Mac 地址（唯一标识）
     *      1.判断 API 是否为 6.0以上
     *         true： 调用6.0以上 获取Mac 地址方法
     *         false：调用6.0以下 获取Mac 地址方法
     */
    public static String getMacAddress(Activity activity) throws SocketException {

        String macAddress = null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            macAddress = getHighMacAddress(activity);
        }else{
            macAddress = getLowMacAddress(activity);
        }
        return macAddress;
    }

    /**
     * 获取pad mac 地址（API 低版本）
     *  6.0 以下调用 ， 获取 mac 真实 地址
     * @return
     */
    public static String getLowMacAddress(Activity activity) {

        String macAddress = null;
        @SuppressLint("WifiManagerLeak") WifiManager wifiManager =
                (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
        WifiInfo info = (null == wifiManager ? null : wifiManager.getConnectionInfo());

        if (!wifiManager.isWifiEnabled()) {
            //必须先打开，才能获取到MAC地址
            wifiManager.setWifiEnabled(true);
            wifiManager.setWifiEnabled(false);
        }
        if (null != info) {
            macAddress = info.getMacAddress();
        }
        return macAddress;
    }

    /**
     * 获取pad mac 地址（API 高版本）
     *
     * 判断 6.0以上调用,获取真实地址
     * @return
     */
    public static String getHighMacAddress(Activity activity) throws SocketException {
        String address = null;
        // 把当前机器上的访问网络接口的存入 Enumeration集合中
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        //设置 wifi 打开
        @SuppressLint("WifiManagerLeak") WifiManager wifiManager =
                (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
        WifiInfo info = (null == wifiManager ? null : wifiManager.getConnectionInfo());

        if (!wifiManager.isWifiEnabled()) {
            //必须先打开，才能获取到MAC地址
            wifiManager.setWifiEnabled(true);
            wifiManager.setWifiEnabled(false);
        }

        while (interfaces.hasMoreElements()) {
            NetworkInterface netWork = interfaces.nextElement();
            // 如果存在硬件地址并可以使用给定的当前权限访问，则返回该硬件地址（通常是 MAC）。
            byte[] by = netWork.getHardwareAddress();
            if (by == null || by.length == 0) {
                continue;
            }
            StringBuilder builder = new StringBuilder();
            for (byte b : by) {
                builder.append(String.format("%02X:", b));
            }
            if (builder.length() > 0) {
                builder.deleteCharAt(builder.length() - 1);
            }
            if (null != info) {
                address = builder.toString();
            }
        }
        return address;
    }
}
